04. 变量 I

Python 完全可以进行算术运算,但变量的使用使 Python 不仅仅是一个计算器。

我们将在这部分课程中学习关于变量的内容。我们将使用马尼拉(Manila,菲律宾首都)的人口数据进行一些计算,并使用变量完成这些计算。使用变量(相对于使用原始数字进行计算)具有许多优点,比如我们可以更高效地说明数据的转换,我们将在后面的内容中体验这一优点。现在先开始计算吧!

在 Python 中创建一个新变量很简单,我们这里创建了一个表示马尼拉人口的变量。

>>> manila_pop = 1780148


此示例中的变量名为 `manila_pop`。等号 `=` 是赋值运算符。变量 `manila_pop` 的值为 1780148。

此示例中的变量名为 manila_pop 。等号 = 是赋值运算符。变量 manila_pop 的值为 1780148。

赋值和打印变量

该赋值表达式的顺序非常重要!我们应始终按照相同的顺序,即变量名 = 值。左侧的变量名是右侧表达式给出值的名称。赋值运算符 = 将右侧的值赋给左侧的变量名。(注意,这与数学中的表达式不同,在数学表达式中 x = y 等同于 y = x

请注意,Python 中没有某些语言中关于变量赋值的关键字,无需指定变量的类型 ,只需直接使用等号为变量赋值即可。

如果要访问该值,仅需使用变量名。例如,我们可以将它打印出来:

>>> print(manila_pop)
1780148

我们在这节课中多次使用了 print 函数。当需要知道某个变量的值是什么时,只用简单地 print 这个变量即可。如果没有 print ,Python 中发生的事情只会停留在 Python 内部。在大多数情况下,Python 程序中的大部分内容都在内部运行,数据只是被使用或传递,直到用户需要看到某些结果的时候为止。 print 有助于大家看到正在执行的内容,这对出现问题时的调试非常有用。

print 是 Python 的一个内置函数,大家将在后面遇到更多内置函数。Python 中的函数调用始终带有一对括号,如果有参数,那么参数放在括号内。
所以 print 函数的语法需要一对括号,并将参数放在括号内。如大家所见,如果在括号里放置的是一个变量,那么打印的结果就是该变量的值,而不是变量的名称。

注意:在 Python 2 中打印时不需要使用括号,但是在 Python 3 中需要,所以请勿忘记括号!

>>> print manila_pop
  File "<stdin>", line 1
    print manila_pop
                    ^
SyntaxError: Missing parentheses in call to 'print'

这里出现了一个 SyntaxError(语法错误),这是关于错误原因的明确信息。在学习的过程中,你可能会经常犯类似的错误,而使用错误信息将有助于改正错误。

名称中出现了哪些错误?

我们一直在研究马尼拉的人口,但是假如我们真的想了解人口密度,那么首先需要创建一个作为计算结果的变量。

>>> manila_pop = 1780148
>>> manila_pop_density = manila_pop / manila_area
NameError: name 'manila_area' is not defined

呃哦 —— 好像又出错了。到底怎么回事?
好吧,我试着除以变量 manila_area ,但还没有将其作为变量名并给它进行赋值,所以导致了一个 NameError。错误信息中清楚说明了问题出在是名称的部分。如果你要使用变量名,首先必须为其赋值!

现在我再试一次:

>>> manila_pop = 1780148
>>> manila_area = 16.56
>>> manila_pop_density = manila_pop/manila_area
>>> print(manila_pop_density)
107496.85990338166

这次没有出现 NameError,并且我们成功计算了马尼拉的人口密度。马尼拉地区的面积为 16.56 平方英里,人口密度是每平方英里的人口数。

给变量命名时,需要注意以下几点:

  • 有一些不能用于变量名的保留字,如 False class ,这些词汇在 Python 中有重要的作用。 保留字列表见此 。尝试为某个保留字赋值将导致一个 SyntaxError
  • 变量名中只能使用普通字母、数字和下划线,且以字母或下划线开头。
  • 虽然在变量名中使用任何内置的标识符不会立即导致错误,但我们也不建议你使用。例如,为 int 赋值时不会引发错误,但当你想要将某数字转换成整数时,一定会出现问题。
>>> int = 7
>>> int(3.0)
TypeError: 'int' object is not callable
  • 最好使用英文单词作为变量名,并尽可能地描述变量内容。如果你想要一个多词变量名,请使用下划线分隔单词。例如 coconut_counter = 2

再次给一个变量赋值!

我们已经将 manila_pop 变量设置为马尼拉的人口,即 1780148。但如果马尼拉的人口出现变化,我们可以更新人口数据吗?人口现在达到了 1781573。我们可以通过为同一个变量名重新赋值来更新 Python 中存储的数据,这将改变该变量的值。

>>> manila_pop = 1781573
>>> print(manila_pop)
1781573

这样一来,旧数据已经被遗忘,取而代之的是 manila_pop 的新值。

我们也可以使用另一种方式,使用 Python 计算来更新数值。假设这个城市新增了 1675 个人,减少了 250 个人。我们可以在 Python 中通过计算求出新值,并在同一步中为变量赋值。

>>> manila_pop = 1780148
>>> print(manila_pop)
1780148
>>> manila_pop = manila_pop + 1675 - 250

位于等号左侧的变量 `manila_pop`,被赋值为整个右侧表达式的值。等号的右侧是表达式 `manila_pop + 1675 - 250`。所以 `manila_pop` 的当前值为 1780148。

位于等号左侧的变量 manila_pop ,被赋值为整个右侧表达式的值。等号的右侧是表达式 manila_pop + 1675 - 250 。所以 manila_pop 的当前值为 1780148。

再次赋值的结果

我们现在可以检查输出:

>>> print(manila_pop)
1781573

在数学计算中, manila_pop = manila_pop + 1675 - 250 这条赋值语句是完全错误的,因为变量名 manila_pop 同时位于等号的两边。但由于等号 = 在 Python 中用于赋值,所以这行代码在 Python 中可以正常运行。

重新赋值运算符

由于这种增量和重新赋值的运算非常普遍,Python 中也包括专门用于重新赋值运算的特殊运算符:

```python

manila_pop += 1675 # increase the value of manila_pop by 1675
manila_pop -= 250 # decrease the value of manila_pop by 250
manila_pop *= 0.9 # decimate manila_pop
manila_area /= 2 # half the area of Manila```

manila_pop += 1675 manila_pop = manila_pop + 1675 的简写。其他重新赋值运算符也是相同的模式。

练习:赋值和修改变量

现在该你来尝试一下使用变量了,该练习中的注释(以 # 开头的代码行)具有创建和修改变量的说明。请在每条注释后,编写代码来实现注释要求的指令。

请注意,此代码使用 科学计数法 来表示数值极大的数字。 4.445e8 等于 4.445 * 10 ** 8 ,也等于 444500000.0

Start Quiz:

# The current volume of a water reservoir (in cubic metres)
reservoir_volume = 4.445e8
# The amount of rainfall from a storm (in cubic metres)
rainfall = 5e6

# decrease the rainfall variable by 10% to account for runoff

# add the rainfall variable to the reservoir_volume variable

# increase reservoir_volume by 5% to account for stormwater that flows
# into the reservoir in the days following the storm

# decrease reservoir_volume by 5% to account for evaporation

# subtract 2.5e5 cubic metres from reservoir_volume to account for water
# that's piped to arid regions.

# print the new value of the reservoir_volume variable